package com.example.springboot.ytest.ytest;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 	--------------------- 
	作者：w20175357 
	来源：CSDN 
	原文：https://blog.csdn.net/w20175357/article/details/79891699?utm_source=copy 
	版权声明：本文为博主原创文章，转载请附上博文链接！

 * @author Administrator
 *
 */
public class ThreadPoolExecutorTest {
	public static void main(String[] args) {

		/**
		 * corePoolSize: 2 正常线程数，一开始最多只能有2个线程。
		 * LinkedBlockingQueue: 7  阻塞队列最大长度，当 runnable 超过 2 个时，要进入这个队列等待。
		 * maximumPoolSize: 4 最大线程数，当 BlockingQueue 装不下时（超过7+2=9个），多出来的 runnable 会启线程运行，但此情况下运行启的不能超过 4 个（maximumPoolSize）。
		 * RejectedExecutionHandler: 线程过多时的处理函数，即 runnable 超过 7+4 后，多出来的就会调用此函数。不启线程。
		 */
	    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 0, TimeUnit.MINUTES,
	            new LinkedBlockingQueue<>(7), new RejectedExecutionHandler() {
	        @Override
	        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
	            System.out.print("rejected");
	        }
	    });
	    for(int i=0; i< 20; i++) {
	        threadPoolExecutor.execute(new Runnable() {
	            @Override
	            public void run() {
	                while(true) {
	                    //让线程一直运行
	                }
	            }
	        });
	        System.out.println(i + ": " + threadPoolExecutor.getActiveCount());
	    }
	}
}
//运行结果：
//0: 1
//1: 2
//2: 2
//3: 2
//4: 2
//5: 2
//6: 2
//7: 2
//8: 2
//9: 3
//10: 4
//rejected11: 4
//rejected12: 4
//rejected13: 4
//rejected14: 4
//rejected15: 4
//rejected16: 4
//rejected17: 4
//rejected18: 4
//rejected19: 4

